package org.osiris.server.bussinesscore
;

import java.util.Date;
import java.util.List;
import java.util.Vector;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.osiris.persistence.Proyecto;
import org.osiris.persistence.Usuario;
import org.osiris.persistence.controllers.ProyectoInterface;
import org.osiris.persistence.controllers.UsuarioInterface;
import org.osiris.server.utils.AppContext;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Repository;


@Repository
public class ProyectosManager {

	private Vector  <Proyecto> proyectosEnUso;
	
	@Resource 
	private ProyectoInterface proyectoDAO;
	@Resource 
	private UsuarioInterface usuarioDAO;
	
	private ApplicationContext ctx = AppContext.getApplicationContext();
	
	private Logger logger=Logger.getLogger(this.getClass());
	
	public ProyectosManager (){
		proyectosEnUso=new Vector<Proyecto>();
		if(proyectoDAO==null){
			proyectoDAO=(ProyectoInterface) ctx.getBean("ProyectoJpaController");
		}
		if(usuarioDAO==null){
			usuarioDAO=(UsuarioInterface) ctx.getBean("UsuarioJpaController");
		}
	}
	
	private Proyecto encontrarProyecto(Proyecto proy)
	{
		
		int posicion=proyectosEnUso.indexOf(proy);

		Proyecto existente=proyectosEnUso.get(posicion);
		
		if(existente==null){
			existente= (Proyecto) this.proyectoDAO.findProyecto(proy.getIdProyecto());
		}
		return existente;
	}


	public Proyecto crearProyecto(String cliente, String descripcion,
			String estado, String nombre, String referencia,
			String usuario_resposanble,String usuario_alta,String resumen){
		logger.info("Guardando...."); 
		
		Proyecto nuevoProyecto=new Proyecto();
		nuevoProyecto.setCliente(cliente);		
		nuevoProyecto.setDescripcion(descripcion);
		nuevoProyecto.setEstado(estado);
		nuevoProyecto.setFechaalta(new Date());
		nuevoProyecto.setFechainicio(new Date());
		nuevoProyecto.setNombre(nombre);
		nuevoProyecto.setReferencia(referencia);
		nuevoProyecto.setResumen(resumen);
		Usuario usuarioidUsuario=usuarioDAO.findUsuario(Long.parseLong(usuario_alta));
		nuevoProyecto.setUsuarioidUsuario(usuarioidUsuario);
		//a�adir observador al crear
		nuevoProyecto.anadirInteresado(usuarioidUsuario);
		logger.info("Guardando Proyecto para:"+nombre+" "+estado+" "+cliente+" descripcion "+ referencia+" "+usuario_resposanble+" "+usuario_alta);
		
		nuevoProyecto.guardar();
			logger.info("Guardado OK");
		
		if(proyectosEnUso!=null){
			proyectosEnUso.add(nuevoProyecto);
		}
		logger.info("added to proyectos en uso");
		return nuevoProyecto;
		
		
	}
	public void cerrarProyecto(Proyecto proy){
		Proyecto existente=this.encontrarProyecto(proy);
		existente.cerrar();
	}
	
	public boolean modificarProyecto(Proyecto proy){
		int posicion=proyectosEnUso.indexOf(proy);

		Proyecto existente=proyectosEnUso.get(posicion);
		
		if(existente==null){
			existente= (Proyecto) this.proyectoDAO.findProyecto(proy.getIdProyecto());
		}else {
			proyectosEnUso.remove(posicion);
		}
		if(proy.getCliente()!=null){
			existente.setCliente(proy.getCliente());
		}
		if(proy.getDescripcion()!=null){
			existente.setDescripcion(proy.getDescripcion());
		}
		if(proy.getFechaalta()!=null){
			existente.setFechaalta(proy.getFechaalta());
		}
		if(proy.getNombre()!=null){
			existente.setNombre(proy.getNombre());
		}
		if(proy.getReferencia()!=null){
			existente.setReferencia(proy.getNombre());
		}
		proyectosEnUso.add(existente);
		existente.guardar();

		return true;

	}
	public boolean asociarRequisito(Long requisito,Long proyecto,Long prioridad,Long incertidumbre,Long autor){
		Proyecto proy = buscarProyecto(proyecto);
		proy.asociarRequisito(requisito, prioridad, incertidumbre, "Aceptado", autor);
		
		return true;
	}
	public boolean desasociarRequisito(Long requisito, Long proyecto){
		Proyecto proy = buscarProyecto(requisito);
		proy.desasociarRequisito(requisito);
		return true;
	}
	public Vector<Proyecto> getProyectosEnUso() {
		return proyectosEnUso;
	}
	public void setProyectosEnUso(Vector<Proyecto> proyectosEnUso) {
		this.proyectosEnUso = proyectosEnUso;
	}
	public ApplicationContext getCtx() {
		return ctx;
	}
	public void setCtx(ApplicationContext ctx) {
		this.ctx = ctx;
	}

	public Logger getLogger() {
		return logger;
	}

	public void setLogger(Logger logger) {
		this.logger = logger;
	}

	public List<Proyecto> buscarProyectos(String cliente, String descripcion,
			String estado, Date fechaalta, Long idProyecto, String nombre,
			String referencia, String usuario) {
		return proyectoDAO.buscarProyectos(cliente, descripcion, estado, fechaalta, idProyecto, nombre, referencia, usuario);
	}
	public Proyecto buscarProyecto(Long idProyecto) {
		return this.proyectoDAO.findProyecto(idProyecto);
	}

}
